Podsumowanie

Celem projektu było określenie jakie czynniki najlepiej pozwalają przewidzieć energię wytwarzaną przez panele fotowoltaiczne na podstawie danych pochodzących z trzech sąsiadujących elektrowni słonecznych we Włoszech. Dane pochodzą z czujników umieszczonych przy panelach fotowoltaicznych. Każdy wiersz w zbiorze danych zawiera uśrednione informacje z jednej godziny pomiarów pojedynczej jednostki fotowoltaicznej.

Analiza danych wykazała korelację pomiędzy wytwarzaniem energii a poniższymi czynnikami:

Typ Czynniki
Metorologiczne nasłonecznienie, wilgotność, zachmurzenie, siła wiatru, ciśnienie i temperatura
Geograficzne azymut, szerokość i wysokość geograficzna

Najbardziej pozytywny wpływ na ilość wytwarzanie energii ma nasłonecznienie, natomiast najbardziej negatywny mają wilgotność powietrza oraz zachmurzenie.

Wykorzystane biblioteki

library(caret)
library(dplyr)
library(ggplot2)
library(knitr)
library(plotly)
library(reshape2)

Wczytywanie danych

set.seed(23)
Sys.setenv(TZ="Europe/Warsaw")
csv_file <- read.csv("elektrownie.csv") %>%
  select(order(colnames(.)))

Przygotowanie danych

  1. Zbiór nie zawiera wartości pustych (NA).
sum(is.na(csv_file))
## [1] 0
  1. Użyto klasy Date do zapisu dat (format %m/%d/%Y %H:%M).
csv_file <- mutate(csv_file, date = as.Date(data, format="%m/%d/%Y %H:%M"))
  1. Wartości atrybutu kwh równe 0, przy nasłonecznieniu (irradiamento, irri, irri_pvgis_mod) większym od zera zostały zinterpretowane jako błędne dane będące wynikiem awarii czujnika w chwili pomiaru. Takie dane zostały zastąpione średnimi wartościami wyprodukowanej energii w danym tygodniu i godzinie.
csv_file <- csv_file %>%
  mutate(week = as.numeric(format(date, format="%W"))) %>%
  group_by(idsito, anno, week, ora) %>%
  mutate(
    kwh = ifelse(
      kwh == 0 & (irradiamento > 0 | irri > 0 | irri_pvgis_mod > 0),
      mean(kwh),
      kwh
    )
  )
  1. Zerowe nasłonecznienie przy wartości kwh większej od zera zinterpretowano jako błędne dane. Każdy taki przypadek zastąpiono średnimi wartościami w danym tygodniu i godzinie.
csv_file <- csv_file %>%
  group_by(idsito, anno, week, ora) %>%
  mutate(
    irradiamento = ifelse(
      irradiamento == 0 & kwh > 0,
      mean(irradiamento),
      irradiamento
    ),
    irri = ifelse(
      irri == 0 & kwh > 0,
      mean(irri),
      irri
    ),
    irri_pvgis_mod = ifelse(
      irri_pvgis_mod == 0 & kwh > 0,
      mean(irri_pvgis_mod),
      irri_pvgis_mod
    )
  )

Rozmiar zbioru

Liczba obserwacji Liczba atrybutów
235790 53

Podstawowe statystyki

Średnia
arytmetyczna
Odchylenie
standardowe
Wartość
minimalna
Wartość
maksymalna
ageinmonths NA 0.377969850595731 0.000 1.000
altitude NA 0.180640706510216 0.111 0.884
altitudei NA 0.149421687798409 0.000 0.982
anno NA 0.500001053775684 2012 2013
azimuth NA 0.196541434110587 0.128 0.818
azimuthi NA 0.182281959028745 0.000 1.000
cloudcover NA 0.259547943384582 0.00 1.00
cloudcoveri NA 0.0300723674633868 0.000 1.000
data NA NA 1/1/2013 10:00 9/9/2013 9:00
day NA 0.275857170407624 0.000 1.000
dewpoint NA 0.095644093176755 0.139 0.865
dewpointi NA 0.013390730911713 0.063 0.415
dist NA 0.296791492738785 0.000000000 1.000000000
humidity NA 0.181745717417974 0.16 1.00
humidityi NA 0.0420095574994939 0.034 0.579
icon NA 0.307598578619976 0.000 0.750
id NA 77627.6114157251 1 276488
idbrand NA 0.11871715206601 0.000 0.417
idmodel NA 0.172247431713612 0.000 0.750
idsito NA 0.133135226997158 0.000 0.425
irr_pvgis_mod NA 0.221045459338012 0.000 1.000
irradiamento NA 0.134180830800575 0.0000000000 0.7100000000
irri NA 0.0115436397438759 0.108 1.000
irri_pvgis_mod NA 0.0534824716006301 0.00100000 -0.02500000
kwh NA 0.210576920016183 0.0000000000 1.0000000000
lat NA 0.0379863282904341 0.415 0.553
lon NA 0.15243695708491 0.154 0.691
ora NA 0.304227015135245 0.000 1.000
pcnm1 NA 0.204379821435305 0.000 1.000
pcnm10 NA 0.212375241468405 0.000 1.000
pcnm11 NA 0.206642766632876 0.000 1.000
pcnm12 NA 0.228931898102406 0.000 1.000
pcnm13 NA 0.19951261364516 0.137 1.000
pcnm14 NA 0.183831119090762 0.000 1.000
pcnm15 NA 0.204619008927417 0.000 1.000
pcnm2 NA 0.214273652558885 0.000 0.972
pcnm3 NA 0.217046163667059 0.000 1.000
pcnm4 NA 0.255570141211408 0.000 1.000
pcnm5 NA 0.250232450734015 0.000 1.000
pcnm6 NA 0.239255594107885 0.000 1.000
pcnm7 NA 0.224933208175947 0.000 1.000
pcnm8 NA 0.263608320452407 0.000 1.000
pcnm9 NA 0.261624641269982 0.000 1.000
pressure NA 0.258467636284461 0.000 0.769
pressurei NA 0.0039992935298197 0.000 1.000
temperatura_ambiente NA 0.172218245052092 0.045 0.818
tempi NA 0.0631091005324502 0.009 0.983
windbearing NA 0.230388817028362 0.000 0.769
windbearingi NA 0.0340350360098665 0.000 1.000
windspeed NA 0.0501476671640903 0.000 0.696
windspeedi NA 0.00488113428267297 0.000 1.000
date NA NA 2012-01-02 2013-12-31
week NA 15.0594529266089 0 53

Analiza wartości

Atrybuty zbioru można podzielić na kilka grup przedstawionych poniżej. Każda sekcja zawiera opis każdego atrybutu oraz wykres rozkładu dla atrybutów liczbowych.

Czujnik

Atrybuty opisowe czujników. Wartości tych atrybutów zostały znormalizowane do zakresu <0, 1>.

Nazwa atrybutu Opis
ageinmonths Wiek czujnika w miesiącach
idbrand Identyfikator marki czujnika
idmodel Identyfikator modelu czujnika

Geograficzne

Dane o miejscu wykonania pomiaru. Wartości tych atrybutów zostały znormalizowane do zakresu <0, 1>.

Nazwa atrybutu Opis
altitude Wysokość nad poziomem morza
azimuth Azymut
lat Szerokość geograficzna
lon Długość geograficzna

Metorologiczne

Dane meterologiczne w chwili wykonania pomiaru.

Nazwa atrybutu Opis
cloudcover Zachmurzenie
dewpoint Temperatura punktu rosy
humidity Wilgotność powietrza
irradiamento Nasłonecznienie
pressure Ciśnienie
temperatura_ambiente Temperatura powietrza
windbearing Kierunek wiatru
windspeed Prędkość wiatru

Dane pomiarowe

Dane identyfikujące pomiar, zawierające wartość wyprodukowanej energii (kwh).

Nazwa atrybutu Opis
anno Rok pomiaru
data Data pomiaru
day Dzień pomiaru
id Identyfikator pomiaru
idsito Identyfikator miejsca pomiaru
kwh Kilowatogodziny wyprodukowanej energii
ora Godzina pomiaru

Pozostałe

Dane nienależące do żadnej z powyższych grup oraz trudne do interpretacji.

Nazwa atrybutu Opis
dist Dzień pomiaru
icon Identyfikator ikony (prawdopodobnie obrazka wizualizującego aktualne warunki pogodowe)
irri Prawdopodobnie alternatywna wartość nasłonecznienia
irr_pvgis_mod Prawdopodobnie wartość opisująca nasłonecznienie
irri_pvgis_mod Prawdopodobnie wartość opisująca nasłonecznienie
pcnm1 ... pcnm15 Principal Coordinates Of Neighbourhood Matrix
tempi Wartość reprezentująca temperaturę

Korelacja

Zmiany wytwarzania energii w czasie i przestrzeni

Regresor

Wybrano metodę regresji liniowej.

data_to_train <- csv_file %>%
  ungroup() %>%
  select(
    altitude, azimuthi, cloudcover, dist, humidity, idsito, irradiamento, irri,
    kwh, pressure, temperatura_ambiente, tempi, windspeed
  )
  

inTraining <- createDataPartition(
  y = data_to_train$idsito,
  p = .75,
  list = FALSE
)
training <- data_to_train[inTraining,]
testing <- data_to_train[-inTraining,]
ctrl <- trainControl(
  method = "repeatedcv",
  number = 2,
  repeats = 5
)

fit <- train(
  kwh ~ .,
  data = training,
  method = "lm",
  metric = "RMSE",
  trControl = ctrl
)
classes <- predict(fit, newdata = testing)
postResample(classes, testing$kwh)
##       RMSE   Rsquared        MAE 
## 0.10256471 0.76225778 0.06451111

Analiza ważności atrybutów

fit %>% summary()
## 
## Call:
## lm(formula = .outcome ~ ., data = dat)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -0.63166 -0.04188 -0.00801  0.03173  1.06872 
## 
## Coefficients:
##                       Estimate Std. Error t value Pr(>|t|)    
## (Intercept)           0.207793   0.005902  35.209  < 2e-16 ***
## altitude              0.034443   0.002459  14.005  < 2e-16 ***
## azimuthi             -0.094763   0.001743 -54.379  < 2e-16 ***
## cloudcover           -0.032720   0.001038 -31.516  < 2e-16 ***
## dist                  0.052877   0.001047  50.502  < 2e-16 ***
## humidity             -0.149497   0.002073 -72.126  < 2e-16 ***
## idsito                0.086042   0.002042  42.136  < 2e-16 ***
## irradiamento          1.232540   0.002981 413.453  < 2e-16 ***
## irri                 -0.224955   0.026196  -8.588  < 2e-16 ***
## pressure             -0.013996   0.001083 -12.925  < 2e-16 ***
## temperatura_ambiente -0.045785   0.002441 -18.754  < 2e-16 ***
## tempi                -0.060819   0.004946 -12.297  < 2e-16 ***
## windspeed            -0.040842   0.005096  -8.014 1.11e-15 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.1022 on 176830 degrees of freedom
## Multiple R-squared:  0.7646, Adjusted R-squared:  0.7646 
## F-statistic: 4.787e+04 on 12 and 176830 DF,  p-value: < 2.2e-16

Wyniki nie są zaskakujące. Atrybutami, które mają największy wpływ na ilość wytwarzanej energii przez panele fotowoltaiczne są nasłonecznienie (korelacja dodatnia) oraz wilgotność (korelacja ujemna).

Prócz nasłonecznienia, na ilość wytwarzanej energii pozytywnie wpływają również wysokość nad poziomem morza oraz data wykonania pomiaru. Natomiast negatywny wpływ, prócz wilgotności, ma również wysoki wskaźnik atrybutów takich jak zachmurzenie, cieśnienie atmosferyczne, azymut czy prędkość wiatru.

To właśnie te atrybuty pozwalają najlepiej przewidzieć energię wytwarzaną przez pojedynczy panel w danej godzinie.